#ifndef RETURN_H_
#define RETURN_H_

#include <stdio.h>
#include <errno.h>

// 정상적인 종료.
#define RETURN_OK 0

// 에러는 아니지만, 정상적인 종료가 아닌 경우.
#define RETURN_NOT_OK 1

// 조건이 만족되지 않아서 실행이 더 이상 안되는 경우.
#define RETURN_BLOCK 2

// 비정상적인 종료.
#define RETURN_ERROR -1

// 잘못된 파라메터를 전달 받았을 경우 비정상적인 종료.
#define RETURN_PARAM_ERROR -2

// 비정상 종료.
// 타임 아웃.
#define RETURN_TIMEOUT ETIMEDOUT

// 비정상 종료.
// 재시도 해보기를 권함을 리턴한다.
#define RETURN_AGAIN EAGAIN

// 비정상 종료.
// 장치 또는 해당 자원을 사용중이다.
#define RETURN_BUSY EBUSY

// 비정상 종료.

// 에러 확인.
#define checkError(P) (P) // (P != RETURN_OK)

#define notifyError(P, S) fprintf(stderr ,"Error: %s\nValue: %x(%d)\n", S, (Number)P,  (Number)P)

#define checkErrorWR(P, S) if (checkError(P)) \
	{ \
		notifyError(P, S); \
		return RETURN_ERROR; \
	}
  
#define checkErrorFV(P, S) if (checkError(P)) \
  { \
		notifyError(P, S); \
		return; \
	}

#define checkErrorWOR(P, S) if (checkError(P)) \
  { \
		notifyError(P, S); \
	}
  
#define checkErrorWG(P, S, L) if (checkError(P)) \
  { \
		notifyError(P, S); \
		goto L; \
	}
  
#define checkErrorWRNull(P, S) if (checkError(P)) \
  { \
		notifyError(P, S); \
		return NULL; \
	}
  
#define checkErrorWRP(P, S) if (checkError(P)) \
	{ \
		notifyError(P, S); \
		return P; \
	}

#define checkNullWR(P, S) if (P == NULL) \
	{ \
		notifyError(P, S); \
		return RETURN_ERROR; \
	}
  
#define checkNullFV(P, S) if (P == NULL) \
	{ \
		notifyError(P, S); \
		return; \
	}
  
#define checkNullWOR(P, S)if (P == NULL) \
	{ \
		notifyError(P, S); \
	}
  
#define checkNullWG(P, S, L) if (P == NULL) \
	{ \
		notifyError(P, S); \
		goto L; \
	}
  
#define checkNullWRNull(P, S) if (P == NULL) \
	{ \
		notifyError(P, S); \
		return NULL; \
	}

#endif //RETURN_H_